import { mkdir } from 'node:fs/promises';
import { dirname } from 'path';

import pino from 'pino';

import { config, safePrintConfig } from '@/config';

// 确保插桩
import '@/plugins/opentelemetry';

// 创建多路输出
const multistream: Parameters<typeof pino.multistream>[0] = [];

// 开发环境使用 pretty 输出
// 生产环境使用 JSON 输出
if (config.NODE_ENV === 'development' || config.NODE_ENV === 'test') {
  multistream.push({
    level: config.LOG_LEVEL,
    stream: pino.transport({
      target: 'pino-pretty',
      options: {
        colorize: true,
        translateTime: 'SYS:yyyy-mm-dd HH:MM:ss.l',
      },
    }),
  });
} else {
  multistream.push({ level: config.LOG_LEVEL, stream: pino.destination(process.stdout) });
}

// 文件日志传输
if (config.LOG_FILE_PATH) {
  // 确保文件目录存在
  await mkdir(dirname(config.LOG_FILE_PATH), { recursive: true });
  multistream.push({
    level: config.LOG_LEVEL,
    stream: pino.destination(config.LOG_FILE_PATH),
  });
}

// OpenTelemetry 日志传输
if (config.OTEL_ENABLED) {
  multistream.push({
    level: config.LOG_LEVEL,
    stream: pino.transport({
      target: 'pino-opentelemetry-transport',
    }),
  });
}

/**
 * 生产级日志实例
 * 使用 pino - 一个快速、低开销的 Node.js 日志库
 *
 * 特性：
 * - 高性能（比 winston 快 5-10 倍）
 * - 结构化日志（JSON 格式）
 * - 低内存占用
 * - 丰富的生态系统
 */
export const logger = pino(
  {
    level: config.LOG_LEVEL,
  },
  pino.multistream(multistream)
);

// 打印 config
logger.info({
  module: 'config',
  config: safePrintConfig,
  msg: '📦 配置加载完成',
});
